// 定义颜色
const colors = {
    red: '\x1b[31m',
    green: '\x1b[32m',
    yellow: '\x1b[33m',
    blue: '\x1b[34m',
    magenta: '\x1b[35m',
    cyan: '\x1b[36m',
    reset: '\x1b[0m'
};

export class Logger{ 
    
    
    /**
     * 时间格式化字符串
     * @param date              时间对象
     * @param format            格式输出标准字符串
     * 
     * 用法
     * let date = new Date()
     * dateFormat("YYYY-mm-dd HH:MM:SS", date) 
     * >>> 2019-06-06 19:45`
     *  
     */
    private static format(date:Date,fmt:string):string{
        let ret;
        const opt:any = {
            "Y+": date.getFullYear().toString(),        // 年
            "m+": (date.getMonth() + 1).toString(),     // 月
            "d+": date.getDate().toString(),            // 日
            "H+": date.getHours().toString(),           // 时
            "M+": date.getMinutes().toString(),         // 分
            "S+": date.getSeconds().toString()          // 秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (let k in opt) { 
            ret = new RegExp("(" + k + ")").exec(fmt);
            if (ret) {
                fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt.k) : (opt[k].padStart(ret[1].length, "0")))
            };
        };
        return fmt;
    }
    /** 日志字符串 */
    private static _getLogStr(...params):string{
        let str:string="GameLogger "+Logger.format(new Date(),"YYYY-mm-dd HH:MM:SS")+"\t";
        for(let i:number=0;i<params.length;i++){
            str+=params[i].toString()+"\t\t";
        }
        return str; 
    }
    static Log(...params):void{
        console.log(colors.green+Logger._getLogStr(params)+colors.reset)
    }
    static log(...params):void{
        Logger.Log(params);
    }
    static Error(...params):void{
        console.error(colors.red + Logger._getLogStr(params)+colors.reset)
    }
    static error(...params):void{ 
        Logger.Error(params);
    }
    static Warn(...params):void{
        console.warn(colors.yellow + Logger._getLogStr(params)+colors.reset)
    }
    static warn(...params):void{ 
        Logger.Warn(params);
    }
}